home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / vaxt.lha / vaxt / tsystem / unassist.c < prev    next >
C/C++ Source or Header  |  1987-12-24  |  3KB  |  119 lines

  1. #include <stdio.h>
  2. #include <sys/param.h>  /* MIN and MAX */
  3. #include <sys/vlimit.h>
  4.  
  5. #define IF ((
  6. #define THEN )?(
  7. #define ELSE ):(
  8. #define FI ))
  9.  
  10. #define MIN_HEAP_SIZE 524288  /* .5 Mb */
  11. #define DEFAULT_HEAP_SIZE 4096000  /* 4 Mb  */
  12. #define STDIO_SPACE   49152   /* be sure to save 48k of data space for stdio */
  13. #define STATIC_SPACE  131072  /* .125Mb for fun, usr "-l" to add to this */
  14. #define SAVED_SPACE   (STDIO_SPACE+STATIC_SPACE)
  15.  
  16. extern char *etext;
  17.  
  18. main( argc, argv )
  19. char **argv;
  20. int argc;
  21. {
  22.     long heap_wanted = -1;
  23.     long leave_wanted = -1;
  24.     long debug = 0;
  25.  
  26.     long
  27.     data_used,
  28.     data_avail,
  29.     max_heap_size,
  30.     heap_size;
  31.               
  32.     long
  33.     total,
  34.     aligned_total,
  35.     aligned_heap_size;
  36.  
  37.     char **av;
  38.  
  39.     av = argv;
  40.     av[argc] = 0; /* easy end test */
  41.  
  42.     while (*av)  {
  43.     if ( ( !strcmp( *av, "-h" ) ) || ( !strcmp( *av, "-heap" ) ) )
  44.         heap_wanted = IF (!*++av) THEN -2 ELSE atoi( *av ) FI;
  45.     else if ( ( !strcmp( *av, "-l" ) ) || ( !strcmp( *av, "-leave" ) ) )
  46.         leave_wanted = IF (!*++av) THEN -2 ELSE atoi( *av ) FI;
  47.     else if (!strcmp( *av, "-d" ) )
  48.         debug = -1;
  49.     av++;
  50.     }
  51.  
  52.     /* Compute max allowed heap size.  MIN in case datasize is big. */
  53.     /*  Quad align. */
  54.  
  55.     data_used  = (char *) sbrk(0) - (char *) &etext;
  56.     data_avail = vlimit(LIM_DATA, -1)
  57.          - ( SAVED_SPACE + data_used + leave_wanted );
  58.     max_heap_size = (data_avail/2) & 0xFFFFFFF8;
  59.                    
  60.     /* decide what to allocate - give user his request if it's within reason */
  61.  
  62.     if (heap_wanted < 0) 
  63.     heap_size = MIN(DEFAULT_HEAP_SIZE,max_heap_size);
  64.     else if (heap_wanted > max_heap_size)
  65.     heap_size = max_heap_size;
  66.     else
  67.     heap_size = MAX( heap_wanted, MIN_HEAP_SIZE );
  68.  
  69.     total = sbrk( heap_size * 2 );
  70.     if (total == -1)  {
  71.     printf( "T could not allocate two heaps of %d bytes.\n", heap_size);
  72.     printf( "Please retry with smaller heaps by using the -h switch.\n");
  73.     exit(1);
  74.     }
  75.         
  76.     /* make heaps smaller (if necessary) for quadword alignment */
  77.  
  78.     aligned_total = (total + 15) & 0xFFFFFFF0;
  79.     aligned_heap_size = ( ((heap_size * 2) - (aligned_total - total))
  80.               & 0xFFFFFFF0 );
  81.  
  82.     heap_size = aligned_heap_size / 2;
  83.  
  84.     /* print message if any command line flag is given */
  85.  
  86.     if ( (heap_wanted != -1) || (leave_wanted != -1) )
  87.     printf( "%d bytes per heap, %d bytes reserved\n",
  88.         heap_size, leave_wanted + STATIC_SPACE );
  89.  
  90.     start_t( aligned_total, (aligned_total + heap_size), heap_size, 
  91.              argc, argv, debug);
  92. }
  93.  
  94. gc_interrupt()
  95. {
  96.   printf("Interrupted during GC; 'q' to exit, anything else to continue GC.\n");
  97.   if (getchar() == 'q')
  98.      exit(0);
  99. }
  100.  
  101. extern int errno;
  102. extern char *sys_errlist[];
  103. extern int sys_nerr;
  104.  
  105. get_unix_error_msg(t, size) 
  106. char *t;
  107. int size; 
  108. {
  109.   char *s;    
  110.   int i;
  111.  
  112.   i = 0;
  113.   s = (char *) sys_errlist[ errno ];
  114.   while (i<size && ((*t++ = *s++) != '\0')) i++; 
  115. }
  116.  
  117.  
  118.  
  119.